package net.tomblog.app.swingheil.oauth;


import java.io.IOException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import net.oauth.OAuth;
import net.oauth.OAuthAccessor;
import net.oauth.OAuthConsumer;
import net.oauth.OAuthException;
import net.oauth.OAuthServiceProvider;
import net.oauth.OAuth.Parameter;
import net.oauth.client.OAuthClient;

/**
 * 
 * Naver OAuth 인증을 위한 Class <p>
 * 
 * Naver OAuth 가이드 : http://dev.naver.com/openapi/apis/oauth/guide 
 * 
 * @author hyunung.park (parkbear01@gmail.com)
 * 
 */
public class NaverOAuth {
	
	public static final String tag = "NaverOAuth";

	/**
	 * 사용자가 Request Token에 대한 인증을 한 후 리다이렉트 할 웹 페이지의 URL입니다.
	 */
	private String oauthCallback;
	
	/**
	 * 네이버 개발자 센터에서 발급 받은 Consumer Key 값입니다.
	 */
	private String oauthConsumerKey = "6eb_KtTH6Jjx";
	
	/**
	 * 네이버 개발자 센터에서 발급 받은 Consumer Secret 값입니다.
	 */
	private String oauthConsumerSecret = "4E928A58A2iAueBz4Mdx";
	
	/**
	 * 컨슈머에서 생성하는 임의적인 문자열로 동일한 타임 스탬프에서는 유일한 값이어야 합니다.
	 */
	private String oauthNonce;
	
	/**
	 * 서명문을 생성하기 위해 사용하는 메소드입니다.
	 */
	private String oauthSignatureMethod;
	
	/**
	 * 요청을 하는 시점의 타임 스탬프로, 1970년 1월 1일 00:00:00 GMT 부터시작한 초 단위의 숫자입니다. 
	 * 타임 스탬프의 값은 항상 이전에 사용한 타임 스탬프의 값보다 커야 합니다.
	 */
	private String oauthTimestamp;
	
	/**
	 * OAuth 인증 과정에서 서비스 프로바이더로부터 제공 받은 토큰 값입니다.
	 */
	private String oauthToken;
	
	/**
	 * OAuth의 버전 정보입니다.
	 */
	private String oauthVersion;
	
	/**
	 * 위의 OAuth 인증 정보를 HMAC-SHA1 서명 후, Base64 인코딩 통해 생성한 서명 값입니다.
	 */
	private String oauthSignature;
	
	/**
	 * Singleton Instance
	 */
	private static NaverOAuth instance;

	public static NaverOAuth getInstance() {
		if (instance == null) {
			synchronized (NaverOAuth.class) {
				if (instance == null) {
					instance = new NaverOAuth();
				}
			}
		}
		return instance;
	}

	/**
	 * 프로바이더에게 Request Token을 요청 
	 */
	public void requestRequestToken() {
		
	    try {
	    	OAuthAccessor accessor = createOAuthAccessor();
	    	OAuthClient client = new OAuthClient(new HttpClient4());

	    	 List<Map.Entry<String, String>> parameters =  new ArrayList<Map.Entry<String, String>>();
	    	 
	    	 client.getRequestToken(accessor, "GET", parameters);
			
	    	 
			System.out.println("requestToken : " + accessor.requestToken);
			System.out.println("tokenSecret : " + accessor.tokenSecret);
			
		} catch (IOException e) {
			e.printStackTrace(); 
		} catch (OAuthException e) {     
			e.printStackTrace();
		} catch (URISyntaxException e) {
			e.printStackTrace();
		}
	}
	

	/**
	 * 프로바이더에게 Access Token을 요청
	 */
	public void requestAccessToken() {
		
	}
	
    private OAuthAccessor createOAuthAccessor(){
        String consumerKey = "6eb_KtTH6Jjx";
        String callbackUrl = "http://tomblog.net";
        String consumerSecret = "4E928A58A2iAueBz4Mdx";

        String reqUrl = "https://nid.naver.com/naver.oauth";
        String authzUrl = "https://nid.naver.com/naver.oauth";
        String accessUrl = "https://nid.naver.com/naver.oauth";

        OAuthServiceProvider provider = new OAuthServiceProvider(reqUrl, authzUrl, accessUrl);
        OAuthConsumer consumer = new OAuthConsumer(callbackUrl, consumerKey, consumerSecret, provider);
        
        return new OAuthAccessor(consumer);
    }
}
